package com.shop.cereshop.commons.tencent.moderation.domain.response;

import com.shop.cereshop.commons.tencent.moderation.constant.ModerationConstant;
import com.shop.cereshop.commons.tencent.moderation.util.ModerationUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @description: 腾讯云视频审核结果
 * @author zdd
 * @date 2025/10/26 23:46
 * @version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class VideoModerationResult implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 审核是否成功
     * true: 审核请求成功（不代表内容通过）
     * false: 审核请求失败
     */
    private boolean success;

    /**
     * 视频审核任务ID
     * 腾讯云返回的唯一任务标识，用于查询审核进度和结果
     */
    private String taskId;

    /**
     * 任务状态
     * PENDING: 任务待处理
     * RUNNING: 任务处理中
     * FINISH: 任务已完成
     * ERROR: 任务出错
     * CANCELLED: 任务已取消
     */
    private String status;

    /**
     * 审核建议
     * Block: 违规，建议拦截
     * Review: 疑似违规，建议人工复核
     * Pass: 正常，建议通过
     */
    private String suggestion;

    /**
     * 违规标签
     * Porn: 色情
     * Terror: 暴恐
     * Polity: 政治敏感
     * Illegal: 违法
     * Abuse: 谩骂
     * Ad: 广告
     * Normal: 正常
     * Custom：自定义违规
     */
    private String label;

    /**
     * 置信度分数
     * 范围：0-100，分数越高表示置信度越高
     * 例如：90 表示90%置信度认为属于该标签
     */
    private Long score;

    /**
     * 错误信息或状态描述
     * 当success为false时，此处包含错误详情
     * 当success为true时，可能包含状态描述信息
     */
    private String message;

    /**
     * 审核耗时（毫秒）
     * 从发起请求到获得结果的总耗时
     * 对于异步任务，指创建任务或查询结果的耗时
     */
    private Long costTime;

    /**
     * 视频详细信息（可选）
     * 包含视频时长、格式、分辨率等信息
     */
    private VideoInfo videoInfo;

    /**
     * 审核详情（可选）
     * 包含具体的违规片段信息、时间戳等详细信息
     */
    private ModerationDetail moderationDetail;

    public static VideoModerationResult success(String taskId, String status) {
        VideoModerationResult result = new VideoModerationResult();
        result.setSuccess(true);
        result.setTaskId(taskId);
        result.setStatus(status);
        return result;
    }

    public static VideoModerationResult fail(String message) {
        VideoModerationResult result = new VideoModerationResult();
        result.setSuccess(false);
        result.setMessage(message);
        return result;
    }

    /**
     * 判断任务是否已完成
     * @return true: 任务已完成, false: 未完成
     */
    public boolean isFinished() {
        return ModerationConstant.TASK_STATUS_FINISH.equals(status);
    }

    /**
     * 判断任务是否失败
     * @return true: 任务失败, false: 未失败
     */
    public boolean isFailed() {
        return ModerationConstant.TASK_STATUS_ERROR.equals(status);
    }

    /**
     * 获取审核建议的中文描述
     * @return 中文描述
     */
    public String getSuggestionDesc() {
        return ModerationUtils.getSuggestionDesc(getSuggestion());
    }

    /**
     * 获取违规标签的中文描述
     * @return 中文描述
     */
    public String getLabelDesc() {
        return ModerationUtils.getLabelDesc(getLabel());
    }

    /**
     * 获取风险级别
     * @return 风险级别
     */
    public String getRiskLevel() {
        return ModerationUtils.getRiskLevel(isSuccess(), getSuggestion(), getScore());
    }

}
